﻿using System;
using NHibernate;
using CRC.Incidencias.Dominio.Clases;
using System.Collections.Generic;

namespace CRC.Incidencias.Dominio.Controladores
{
    public class ControladorModificarIncidencia : ControladorBaseIncidencia
    {
        private Incidencia incidencia = null;

        public Object[] ObtenerInformacionIncidencia(int pIntIncidencia)
        {
            ISession session = null;
            ITransaction tx = null;
            Object[] infoIncidencia = new Object[5];

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                this.incidencia = (Incidencia)session.Get(typeof(Incidencia), pIntIncidencia);

                infoIncidencia[0] = this.incidencia.AfectaA.Codigo;
                infoIncidencia[1] = this.incidencia.AfectaA.EscribirRuta();
                if (this.incidencia.AsignadoA != null)
                {
                    infoIncidencia[2] = this.incidencia.AsignadoA.Id;
                }
                else {
                    infoIncidencia[2] = -1;
                }

                infoIncidencia[3] = this.incidencia.FechaLimiteParaSolucion;
                infoIncidencia[4] = this.incidencia.Observaciones;

                tx.Commit();
                return infoIncidencia;
            }
            catch (HibernateException he)
            {
                if (tx != null)
                {
                    tx.Rollback();
                    session.Close();
                }
                throw he;
            }
        }

        public void ModificarIncidencia(String pStrAfectaA, int pIntAsignadoA, DateTime? pFechaLimite, 
            String pStrObs, Boolean pBSolucionada)
        {
            ISession session = null;
            ITransaction tx = null;

            try
            {
                session = CRC.NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                if (incidencia.AfectaA.Codigo.CompareTo(pStrAfectaA) != 0)
                    incidencia.AfectaA = (Concepto)session.Get(typeof(Concepto), pStrAfectaA);

                if (incidencia.AsignadoA == null)
                {
                    if (pIntAsignadoA != -1)
                    {
                        incidencia.AsignadoA = (AsignacionIncidencia)session.Get(typeof(AsignacionIncidencia), pIntAsignadoA);
                    }                   
                }
                else {
                    if (incidencia.AsignadoA.Id != pIntAsignadoA)
                        incidencia.AsignadoA = (AsignacionIncidencia)session.Get(typeof(AsignacionIncidencia), pIntAsignadoA);
                }              
                incidencia.FechaLimiteParaSolucion = pFechaLimite;
                incidencia.Observaciones = pStrObs;
                incidencia.Cerrada = pBSolucionada;
                
                session.Update(incidencia);
                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                session.Close();
                throw he;
            }
        }
    }
}
